using System;
using System.Collections.Generic;
using System.Text;
using EntidadesTO;
using LogicaNegocio;
using System.Transactions;

namespace Controladoras
{
    public class SolicitudDeFraccionamientoMantenedor
    {
        private static SolicitudDeFraccionamientoMantenedor instancia;
        private List<SolicitudDeFraccionamientoTO> listaSolicitud;
        private SolicitudDeFraccionamientoBL solicitudBL;

        public static SolicitudDeFraccionamientoMantenedor ObtenerInstancia()
        {
            if (instancia == null)
            {
                instancia = new SolicitudDeFraccionamientoMantenedor(); 
            }
            return instancia;
        }

        //Constructor de la clase
        private SolicitudDeFraccionamientoMantenedor()
        {
            listaSolicitud = new List<SolicitudDeFraccionamientoTO>();
            solicitudBL = new SolicitudDeFraccionamientoBL();
        }

        public int GuardarNuevo(SolicitudDeFraccionamientoTO pSolicitud)
        {
            int numSolicitud = -1;
            try
            {
                using (TransactionScope contexto = new TransactionScope())
                {
                    numSolicitud = solicitudBL.GuardarNuevo(pSolicitud);
                    contexto.Complete();
                }
                PersonaTO personaTO;
                string correo;

                PersonaMantenedor.ObtenerInstancia().BuscarPorLlave(pSolicitud.CodPersona);
                personaTO = PersonaMantenedor.ObtenerInstancia().ListaPersona[0];
                correo = personaTO.DesCorreoElectronico;

                CorreoElectronicoMantenedor.ObtenerInstancia().SendMail(correo, Util.usermail, Util.passmail, Util.frommail, Util.msgheader, Util.msgbodyRegistrarSol, Util.hostmail);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return numSolicitud;
        }


        public void CargarLista(int pNumeroSolicitud, DateTime pFechaIni, DateTime pFechaFin, int pCodPersona, int pCodEstadoSolicitud)
        {
            listaSolicitud = solicitudBL.ListarPorFiltro(pNumeroSolicitud,pFechaIni, pFechaFin, pCodPersona, pCodEstadoSolicitud);
        }

        //Devolver la lista de documentos legales
        public List<SolicitudDeFraccionamientoTO> ListaSolicitud
        {
            get
            {
                return this.listaSolicitud;
            }
        }

        public void ValidarEstadoParaEvaluacion(SolicitudDeFraccionamientoTO pSolicitud)
        {
            try
            {
                this.solicitudBL.ValidarEstadoParaEvaluacion(pSolicitud);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void ActualizarEstado(int pNumeroSolicitud, int pCodEstadoSolicitud, int pCodPersona)
        {
            try
            {
                using (TransactionScope contexto = new TransactionScope())
                {
                    solicitudBL.ActualizarEstado(pNumeroSolicitud, pCodEstadoSolicitud);
                    contexto.Complete();
                }
                PersonaTO personaTO;
                string correo;

                PersonaMantenedor.ObtenerInstancia().BuscarPorLlave(pCodPersona);
                personaTO = PersonaMantenedor.ObtenerInstancia().ListaPersona[0];
                correo = personaTO.DesCorreoElectronico;

                CorreoElectronicoMantenedor.ObtenerInstancia().SendMail(correo, Util.usermail, Util.passmail, Util.frommail, Util.msgheader, Util.msgbodyRechazarSol, Util.hostmail);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void GenerarCuotasFraccionamiento(int pNumeroSolicitud, List<CuentaCorrienteTO> listaCuentaCorriente, List<CuentaCorrienteTO> listaNuevasCuotas, DateTime pFecha, int pCodPersona)
        {
            try
            {
                using (TransactionScope contexto = new TransactionScope())
                {
                    solicitudBL.ActualizarEstado(pNumeroSolicitud, 2); //codigo aprobado

                    for (int i = 0; i < listaCuentaCorriente.Count; i++)
                    {
                        CuentaCorrienteMantenedor.ObtenerInstancia().FinanciarCuentaCorriente(listaCuentaCorriente[i].NumComprobante, pNumeroSolicitud, pFecha);
                    }

                    for (int j = 0; j < listaNuevasCuotas.Count; j++)
                    {
                        CuentaCorrienteMantenedor.ObtenerInstancia().GrabarCuentaCorriente_individual(listaNuevasCuotas[j]);
                    }
                    
                    contexto.Complete();
                }

                PersonaTO personaTO;
                string correo;

                PersonaMantenedor.ObtenerInstancia().BuscarPorLlave(pCodPersona);
                personaTO = PersonaMantenedor.ObtenerInstancia().ListaPersona[0];
                correo = personaTO.DesCorreoElectronico;

                CorreoElectronicoMantenedor.ObtenerInstancia().SendMail(correo, Util.usermail, Util.passmail, Util.frommail, Util.msgheader, Util.msgbodyAprobarSol, Util.hostmail);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}
